Scrapy 学习
前言
之前用写 NodeJS写的爬虫感谢效率太低了,所以尝试一下这个爬虫框架,算是熟悉一下 Python 的项目结构
配置环境
pip install scrapy
# 安装好之后,测试是否能运行
scrapy bench
# 创建项目
scrapy startproject 项目名
# 生成爬虫,爬虫名不能和项目一样(这个 gen 是 generate:产生 的意思)
scrapy genspider 爬虫名 被扒域名
# 例:scrapy genspider study01 ssr1.scrape.center
然后就会自动生成这个文件
# -*- coding:utf-8 -*-
import scrapy
# 创建爬虫类,并且继承 scrapy.Spider
class Study01Spider(scrapy.Spider):
name = 'study01' # 名字必须唯一
allowed_domains = ['ssr1.scrape.center'] # 允许采集的域名
start_urls = ['http://ssr1.scrape.center/'] # 开始采集的网站
# 解析响应数据
def parse(self, response):
pass
注意:这里 parse 父类方法会抛出错误,目的是防止用户自己写的 Spider
没有覆盖这个方法,当没有覆盖这个方法时会自动抛出这个错误
def parse(self, response, **kwargs):
raise NotImplementedError('{}.parse callback is not defined'.format(self.__class__.__name__))
然后进入 settings.py
里把 ROBOTSTXT_OBEY
改成 False(大写)
这个 ROBOTSTXT_OBEY
是一个反爬协议,开启了就表示遵守这个协议,哪些字段不能爬取
一般在网站根目录下的 robots.txt 文件
例如:
https://www.nike.com/robots.txt
Disallow 表示不可以爬
Allow 表示可以爬
启动爬虫
# 启动
scrapy crawl 爬虫名
设置日志
因为默认的日志打印一堆看着有点烦,实际上这个日志是可以关的
同样在 settings.py
里加上 LOG_LEVEL = "WARNING"
设置日志等级为警告及以上才显示
如果要使用日志的话可以引入日志模块
import logging
logging.info('测试 INFO')
logging.warning('测试 WARING')
logging.debug('测试 DEBUG')
logging.error('测试 ERROR')
# 或者在使用前加上调用者名字,日志就能显示调用的类名了
logger = logging.getLogger(__name__)
logger.warning('测试')
可以把日志输出到某个地方
在 settings.py
里加上 LOG_FILE = "./temp.log"
搭建一个服务
直接上来就去拿各种网站练手效率太低了,所以这里可以先搭建一个 NodeJS 服务
但是注意:如果要测试代理的话最好把这个部署到远程服务器上去
# 初始化项目
npm init
# 下载依赖
npm install express --save
编写服务
// 引入模块
const express = require('express')
// 创建网站服务器
const app = express();
// 如果是 / 表示这个是根项目(和javaWeb 一样)
app.get('/',(req,res)=>{
// 响应方法是 send() 能够自动把 响应类型、类型编码、http状态码 等信息写到响应头里
console.log('==================请求头====================');
console.log(req.headers);
console.log('==================响应头====================');
console.log(res.getHeaders());
console.log('==================IP地址====================');
let getClientIp = function (req) {
return req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress || '';
};
console.log(getClientIp(req));
res.send('Hello Express !');
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');
# 启动服务
node .\main.js
# 访问 http://localhost:3000/
编写脚本:
import scrapy
class TestspiderSpider(scrapy.Spider):
name = 'testSpider'
allowed_domains = ['localhost']
start_urls = ['http://localhost:3000/']
def parse(self, response):
print(response)
if __name__ == '__main__':
from scrapy import cmdline
cmdline.execute("scrapy crawl testSpider".split())